﻿using System.Text.RegularExpressions;
using System.Windows.Forms;
using System;

namespace Siav
{
    class Validacoes
    {
        /// <summary>
        /// Verifica se um e-mail é válido
        /// <summary>
        public static bool EmailValido(string str)
        {
            if (!string.IsNullOrEmpty(str))
            {
                Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
                return regex.IsMatch(str);
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Verifica se um Cpf é válido
        /// <summary>
        public static bool CpfValido(string str)
        {
            if (!string.IsNullOrEmpty(str))
            {
                Regex regex = new Regex(@"(^(\d{3}.\d{3}.\d{3}-\d{2})|(\d{11})$)");
                return regex.IsMatch(str);
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Verifica se um Cep é válido
        /// <summary>
        public static bool CepValido(string str)
        {
            if (!string.IsNullOrEmpty(str))
            {
                Regex regex = new Regex(@"\d{5}\-\d{3}");
                return regex.IsMatch(str);
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Verifica se um Cnpj é válido
        /// </summary>
        public static bool CnpjValido(string str)
        {
            if (!string.IsNullOrEmpty(str))
            {
                Regex regex = new Regex(@"(^(\d{2}.\d{3}.\d{3}/\d{4}-\d{2})|(\d{14})$)");
                return regex.IsMatch(str);
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Verifica se um nome é válido
        /// <summary>
        public static bool NomeValido(string str)
        {
            if (!string.IsNullOrEmpty(str))
            {
                Regex regex = new Regex(@"^([\'\.\^\~\´\`\\áÁ\\àÀ\\ãÃ\\âÂ\\éÉ\\èÈ\\êÊ\\íÍ\\ìÌ\\óÓ\\òÒ\\õÕ\\ôÔ\\úÚ\\ùÙ\\çÇaA-zZ]+)+((\s[\'\.\^\~\´\`\\áÁ\\àÀ\\ãÃ\\âÂ\\éÉ\\èÈ\\êÊ\\íÍ\\ìÌ\\óÓ\\òÒ\\õÕ\\ôÔ\\úÚ\\ùÙ\\çÇaA-zZ]+)+)?$");
                return regex.IsMatch(str);
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Verifica se uma url é válida
        /// <summary>        
        public static bool UrlValida(string url)
        {
            if (!string.IsNullOrEmpty(url))
            {
                Regex regex = new Regex(@"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?");
                return regex.IsMatch(url);
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Verifica o dígito verificador do CPF
        /// </summary>
        /// <param name="cpf">CPF</param>
        /// <returns>True ou False</returns>
        public static bool ValidarDvCpf(string cpf)
        {
            if (string.IsNullOrEmpty(cpf))
            {
                return false;
            }
            try
            {
                string valor = cpf.Replace(".", string.Empty);
                valor = valor.Replace("-", string.Empty);
                if (valor.Length != 11)
                {
                    return false;
                }

                bool igual = true;
                for (int i = 1; i < 11 && igual; i++)
                {
                    if (valor[i] != valor[0])
                    {
                        igual = false;
                    }
                }
                if (igual || valor == "12345678909")
                {
                    return false;
                }

                int[] numeros = new int[11];
                for (int i = 0; i < 11; i++)
                {
                    numeros[i] = int.Parse(valor[i].ToString());
                }

                int soma = 0;
                for (int i = 0; i < 9; i++)
                {
                    soma += (10 - i) * numeros[i];
                }

                int resultado = soma % 11;
                if (resultado == 1 || resultado == 0)
                {
                    if (numeros[9] != 0)
                    {
                        return false;
                    }
                }
                else if (numeros[9] != 11 - resultado)
                {
                    return false;
                }

                soma = 0;
                for (int i = 0; i < 10; i++)
                {
                    soma += (11 - i) * numeros[i];
                }

                resultado = soma % 11;
                if (resultado == 1 || resultado == 0)
                {
                    if (numeros[10] != 0)
                    {
                        return false;
                    }
                }
                else
                {
                    if (numeros[10] != 11 - resultado)
                    {
                        return false;
                    }
                }

                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Verifica o dígito verificador do CNPJ
        /// </summary>
        /// <param name="cnpj">CNPF</param>
        /// <returns>True ou False</returns>
        public static bool ValidaDvCnpj(string cnpj)
        {
            if (string.IsNullOrEmpty(cnpj))
            {
                return false;
            }

            try
            {
                int[] multiplicador1 = new int[12] { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
                int[] multiplicador2 = new int[13] { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
                int soma = default(int);
                int resto = default(int);
                string digito = default(string);
                string tempCnpj = default(string);

                cnpj = cnpj.Trim();
                cnpj = cnpj.Replace(".", "").Replace("-", "").Replace("/", "");

                if (cnpj.Length != 14)
                {
                    return false;
                }
                tempCnpj = cnpj.Substring(0, 12);

                soma = 0;
                for (int i = 0; i < 12; i++)
                {
                    soma += int.Parse(tempCnpj[i].ToString()) * multiplicador1[i];
                }

                resto = (soma % 11);
                if (resto < 2)
                {
                    resto = 0;
                }
                else
                {
                    resto = 11 - resto;
                }

                digito = resto.ToString();
                tempCnpj = tempCnpj + digito;
                soma = 0;
                for (int i = 0; i < 13; i++)
                {
                    soma += int.Parse(tempCnpj[i].ToString()) * multiplicador2[i];
                }

                resto = (soma % 11);
                if (resto < 2)
                {
                    resto = 0;
                }
                else
                {
                    resto = 11 - resto;
                }

                digito = digito + resto.ToString();
                return cnpj.EndsWith(digito);
            }
            catch
            {
                return false;
            }
        }
        /// <summary>
        /// Apaga todos os textboxes de uma página, recursivamente
        /// <summary>
        public static void LimpaCamposFormulario(Control.ControlCollection controles)
        {
            foreach (Control ctrl in controles)
            {
                if (ctrl is TextBox)
                {
                    ((TextBox)(ctrl)).Clear();
                }
                if (ctrl is ComboBox)
                {
                    ((ComboBox)(ctrl)).SelectedIndex = -1;
                }
                LimpaCamposFormulario(ctrl.Controls);
            }
        }
        public static string removeFormatacao(string texto)
        {
            string txt = "";

            txt = texto.Replace(".", "");
            txt = txt.Replace("-", "");
            txt = txt.Replace("/", "");
            txt = txt.Replace("(", "");
            txt = txt.Replace(")", "");
            txt = txt.Replace(" ", "");

            return txt;
        }
        public static string TirarAcento(string palavra)
        {
            string palavraSemAcento = "";
            string caracterComAcento = "áàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÖÔÚÙÛÜÇ";
            string caracterSemAcento = "aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC";

            for (int i = 0; i < palavra.Length; i++)
            {
                if (caracterComAcento.IndexOf(Convert.ToChar(palavra.Substring(i, 1))) >= 0)
                {
                    int car = caracterComAcento.IndexOf(Convert.ToChar(palavra.Substring(i, 1)));
                    palavraSemAcento += caracterSemAcento.Substring(car, 1);
                }
                else
                {
                    palavraSemAcento += palavra.Substring(i, 1);
                }
            }
            
            return palavraSemAcento;
        }

        private static int m_Usuario;
        public static int Usuario
        {
            get { return m_Usuario; }
            set { m_Usuario = value; }
        }

        private static int m_NumeroPedido;
        public static int NumeroPedido
        {
            get { return m_NumeroPedido; }
            set { m_NumeroPedido = value; }
        }

        private static string vJustificativa;
        public string Justificativa
        {
            get { return vJustificativa; }
            set { vJustificativa = value; }
        }

        public static void Informacao(string mensagemDeErro)
        {
            MessageBox.Show(mensagemDeErro, "Informação", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        public static void Erro(string mensagemDeErro)
        {
            MessageBox.Show(mensagemDeErro, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        public static void Aviso(string mensagemDeErro)
        {
            MessageBox.Show(mensagemDeErro, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
    }
    
}
